package progress;

import javafx.application.Application;
import javafx.concurrent.ScheduledService;
import javafx.concurrent.Service;
import javafx.concurrent.Task;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ProgressBar;
import javafx.stage.Stage;
import javafx.util.Duration;
import javafx.scene.layout.*;

// 进度条(多任务处理,JavaFX中有相关的类3个)
public class ProgressBarDemo extends Application {
	private HBox root = new HBox(10);
	private ProgressBar pb;
	private Button start;
	private Button cancel;
	private Button restart;
	private Button reset;
	private ScheduledService<Double> ss;	// 运行多次(restart相当于继续任务)
	private Service<Double> service;	// 运行多次(restart相当于重新执行任务)
	private double i = 0;
	
	public static void main(String[] args) {		// main线程
		launch(args);
	}
	
	@Override
	public void start(Stage stage) {
		
		root.setAlignment(Pos.CENTER);
		
		pb = new ProgressBar();
//		pb.setProgress(0.25);	// 指定进度条进度
//		pb.setProgress(ProgressBar.INDETERMINATE_PROGRESS);	// 设置进度不确定状态
		pb.setLayoutX(100);
		pb.setLayoutY(30);
		
		start = new Button("开始");
		cancel = new Button("取消");
		restart = new Button("重新开始");
		reset = new Button("重置");
		root.getChildren().addAll(start, cancel, restart, reset, pb);
		
		Scene scene = new Scene(root, 400, 300);
		stage.setScene(scene);
		stage.show();
		
		// 多任务(此类产生的线程为守护线程,即前台线程停止,后台线程也会停止)
		ss = new ScheduledService<Double>() {
					
			@Override
			protected Task<Double> createTask() {
						
				Task<Double> task = new Task<Double>() {
					@Override
					protected Double call() throws Exception {	 // Thread-5
						return i = i + 0.1;  
					}
							
					@Override
					protected void updateValue(Double value) {   // JavaFX Application Thread用于更新界面
						pb.setProgress(i);  
						if(i >= 1) {
							ss.cancel();	// 取消任务
						}
					}
				}; 
				return task;
			}
		};
				
		ss.setDelay(Duration.seconds(0));		// 设置执行的延迟时间
		ss.setPeriod(Duration.seconds(1));		// 任务执行的周期
		
//		service = new Service<Double>() {
//			double i = 0;
//			@Override
//			protected Task<Double> createTask() {
//				Task<Double> task = new Task<Double>() {
//					
//					@Override
//					protected Double call() throws Exception {	 // Thread-5
//						return i = i + 0.1;  
//					}
//							
//					@Override
//					protected void updateValue(Double value) {   // JavaFX Application Thread用于更新界面
//						pb.setProgress(i);  
//						if(i >= 1) {
//							service.cancel();	// 取消任务
//						}
//					}
//				}; 
//				return task;
//			}
//		};
		
		// 事件
		// 任务的开始,取消,重新开始,重置(注意顺序,取消后要重置才能重新开始)
		start.setOnMouseClicked(e -> ss.start() );
		cancel.setOnMouseClicked(e -> ss.cancel() );
		restart.setOnMouseClicked(e -> ss.restart() );
		reset.setOnMouseClicked(e -> {
			ss.reset();
			i = 0;
		});
	}
}





